package main

// 退化赋值 最少有一个新变量被定义，且必须是同一作用域
// func main() {
// 	x := 100
// 	print(&x)
// 	print("\n")

// 	// x, y := 200, "abc"
// 	// // x := 200
// 	// print(&x, "\n", x)
// 	// print(y)

// 	{
// 		// x, y := 200, "abc"
// 		x := 200
// 		println(&x, "\n")
// 		// println(y)
// 	}

// }

// 多变量赋值
// func main() {
// 	x, y := 1, 2
// 	x, y = y+3, x+2
// 	println(x, y)
// }

// 常量值

// func main() {
// 	const (
// 		x uint16 = 120
// 		y
// 		s = "abc"
// 		z
// 	)
// 	fmt.Printf("%T, %v\n", y, y) // 输出类型 值
// 	fmt.Printf("%T, %v\n", z, z)
// }

// 枚举
// type color byte

// const (
// 	black color = iota
// 	red
// 	blue
// )

// func test(c color) {
// 	println(c)
// }

// func test2(c int) {
// 	println(c)
// }

// func main() {
// 	test(red)
// 	test(100)

// 	test2(3)
// 	x := 2
// 	test(2)
// 	test(x)
// }

// 展开
// var x = 0x100

// const y = 0x200

// func main() {
// 	println(&x, x)
// 	println(&y, y)	// 数字常量 不会分配存储地址, 无法像变量一样寻址
// }

//2.4 基本类型
// strconv 不同进制（字符串） 转换
// import "strconv"

// func main() {
// 	a, _ := strconv.ParseInt("1100100", 2, 32)
// 	b, _ := strconv.ParseInt("0144", 8, 32)
// 	c, _ := strconv.ParseInt("64", 16, 32)

// 	println(a, b, c)

// 	println("0b" + strconv.FormatInt(a, 2))
// 	println("0" + strconv.FormatInt(b, 8))
// 	println("0x" + strconv.FormatInt(c, 16))

// }

// 使用浮点数 须注意小数点的有效精度

// 别名
// byte alias for uint8
// rune alias for int32
// func test(x byte) {
// 	println(x)
// }

// func main() {
// 	var a byte = 0x11
// 	var b uint8 = a
// 	var c uint8 = a + b
// 	test(c)
// }

// 2.5 引用类型
// func mkslice() []int {
// 	s := make([]int, 0, 32)
// 	s = append(s, 100)
// 	return s
// }

// func mkmap() map[string]string {
// 	m := make(map[string]string)
// 	m["a"] = "abc"
// 	return m
// }

// func main() {
// 	m := mkmap()
// 	println(m["a"])
// 	s := mkslice()
// 	println(s[0])
// }

// 类型转换 特殊类型转换为避免出现歧义 必须使用括号
// func main() {
// 	x := 100
// 	p := (*int)(&x)
// 	println(p)
// }

// 2.7 自定义类型
import "fmt"

type flags byte

const (
	read flags = 1 << iota
	write
	exec
)

func main() {
	f := read | exec

	fmt.Printf("%b\n", f)
}
